package br.com.werp.regras.almoxarifado.integracao;

import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.vos.almoxarifado.EntradaDocumentoVO;
import br.com.werp.regras.geral.vos.almoxarifado.EntradaItemVO;
import br.com.werp.regras.geral.vos.tabelas.Entrada;
import br.com.werp.regras.geral.vos.tabelas.Entrada_item;

import java.sql.Connection;
import java.sql.PreparedStatement;

import java.util.List;


/**
 * @author Sobreira
 * Criado em 24/10/2005
 */
public class EntradaDAO extends MasterDAO {
    private static EntradaDAO entradaDAO;
    public static final String APAGAR_ENTRADA_ITEM = "APAGAR_ENTRADA_ITEM";

    private EntradaDAO(String banco) throws Exception {
        super(banco);
    }

    public static EntradaDAO getEntradaDAO() throws Exception {
        if (entradaDAO == null) {
            entradaDAO = new EntradaDAO("");
        }

        return entradaDAO;
    }

    public void inserirEntrada(Object key, Entrada entrada)
        throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, entrada);
    }

    public void atualizarEntrada(Object key, Entrada entrada)
        throws Exception {
        Connection conn = validarTransacao(key);
        atualizarVO(conn, entrada, new String[] { "entr_documento" });
    }

    public void inserirEntradaItem(Object key, Entrada_item entrada_item)
        throws Exception {
        Connection conn = validarTransacao(key);
        inserirVO(conn, entrada_item, new String[] { "etit_id" });
    }

    public List obterEntradaItens(Object key, Entrada_item entrada_item)
        throws Exception {
        Connection connection = (Connection) key;

        return pesquisarVO(connection, entrada_item);
    }

    public List obterEntradaItens(Entrada_item entrada_item)
        throws Exception {
        Connection connection = (Connection) getConexao();

        try {
            return obterEntradaItens(connection, entrada_item);
        } finally {
            liberaConeccao(connection);
        }
    }

    public void apagarEntradaItem(Object key, EntradaItemVO entradaItemVO)
        throws Exception {
        Connection conn = validarTransacao(key);
        String query = getQuery(APAGAR_ENTRADA_ITEM);
        PreparedStatement statement = conn.prepareStatement(query);
        setInt(1, statement, entradaItemVO.getEtit_id());
        statement.executeUpdate();
    }

    public List obterEntrada(EntradaDocumentoVO entradaDocumentoVO)
        throws Exception {
        return obterEntrada(entradaDocumentoVO, null, null);
    }

    public List obterEntrada(EntradaDocumentoVO entradaDocumentoVO, Dia inicio,
        Dia fim) throws Exception {
        Connection conn = getConexao();

        try {
            String tabelas =
                "entrada, documento, documento_financeiro, tipo_documento," +
                "empresa";

            String where = "entr_documento = docm_id " +
                "and docm_id = dcfi_documento and " +
                "docm_tipo = tdoc_id and " + "empr_empresa = " +
                entradaDocumentoVO.getDcfi_filial();

            if (!"".equals(entradaDocumentoVO.getDcfi_emissao()) &&
                    (entradaDocumentoVO.getDcfi_emissao() != null)) {
                where += (" and dcfi_emissao like " +
                (new Dia(entradaDocumentoVO.getDcfi_emissao()).getDataBanco()));
            }

            if (!"".equals(entradaDocumentoVO.getDcfi_numero_emissor()) &&
                    (entradaDocumentoVO.getDcfi_numero_emissor() != null)) {
                where += (" and dcfi_numero_emissor = " +
                entradaDocumentoVO.getDcfi_numero_emissor());
            }

            if (0 != entradaDocumentoVO.getDocm_id()) {
                where += (" and docm_id = " + entradaDocumentoVO.getDocm_id());
            }

            if (!"".equals(entradaDocumentoVO.getDcfi_descricao()) &&
                    (entradaDocumentoVO.getDcfi_descricao() != null)) {
                where += (" and dcfi_descricao like " +
                aspasLike(entradaDocumentoVO.getDcfi_descricao()));
            }

            if (entradaDocumentoVO.getDocm_pessoa() != 0) {
                where += (" and docm_pessoa = " +
                entradaDocumentoVO.getDocm_pessoa());
            }

            if (inicio != null) {
                where += (" and dcfi_emissao >= " + inicio.getDataBanco());
            }

            if (fim != null) {
                where += (" and dcfi_emissao <= " + fim.getDataBanco());
            }

            return preencheVO(conn, new EntradaDocumentoVO(), tabelas, where);
        } finally {
            liberaConeccao(conn);
        }
    }

    public List obterEntradaPorDocId(EntradaDocumentoVO docVO) throws Exception {
        EntradaDocumentoVO documentoVO = new EntradaDocumentoVO();
        documentoVO.setDocm_id(docVO.getDocm_id());
        documentoVO.setDcfi_filial(docVO.getDcfi_filial());
        return obterEntrada(documentoVO);
    }
}
